package com.demo.java.OD651_700.OD667;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【最优策略组合下的总的系统消耗资源数(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/148086809
 */
public class OdMain {
    /**
     * 最优策略组合下的总的系统消耗资源数
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 用户数量

        List<List<Res>> resList = new ArrayList<>(n);  // 存储每个用户的三个策略消耗值
        for (int i = 0; i < n; i++) {
            List<Res> iResList = new ArrayList<>(3);  // 存储当前用户的三个策略
            for (int j = 0; j < 3; j++) {
                Res res = new Res();
                res.index = j;  // 策略索引
                res.value = scanner.nextInt();  // 策略消耗值
                iResList.add(res);
            }
            resList.add(iResList);  // 将每个用户的策略列表加入总列表
        }

        int total = 0;  // 总消耗资源数
        int preRes = -1;  // 前一个用户选择的策略，初始化为-1（表示无前用户）

        // 遍历所有用户
        for (int i = 0; i < n; i++) {
            // 获取当前用户的所有策略，按照资源消耗从低到高排序，若消耗一样，优先选择索引较大的
            List<Res> iResList = resList.get(i);
            iResList = iResList.stream()
                    .sorted(Comparator.comparing(Res::getIndex))  // 如果有多个满足要求的策略，选最后一个，所以排在前面供选择
                    .sorted(Comparator.comparing(Res::getValue))  // 按照资源消耗排序，消耗少的排前面
                    .collect(Collectors.toList());

            // 选择策略
            for (Res res : iResList) {
                // 如果是第一个用户，或者后面的用户和前一个用户选择不同的策略
                if (preRes == -1 || res.getIndex() != preRes) {
                    total += res.getValue();  // 加上当前选择的策略消耗值
                    preRes = res.getIndex();  // 更新前一个用户的选择策略
                    break;  // 当前用户选择完策略后跳出循环
                }
            }
        }

        // 输出最终的总资源消耗
        System.out.println(total);
    }

    // 用于存储策略信息
    static class Res {
        public int index;  // 策略的索引（0: A, 1: B, 2: C）
        public int value;  // 策略的消耗值

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }
}
